table of contents
INTRO(2) | Podręcznik programisty Linuksa | INTRO(2) |
NAZWA¶
intro - wprowadzenie do wywołań systemowych
OPIS¶
Ten dział opisuje wywołania systemowe Linuksa. Listę wszystkich 164 wywołań systemowych obecnych w jądrze 2.0 Linuksa można znaleźć w syscalls(2).
Wywoływanie bezpośrednie¶
W większości przypadków nie jest konieczne wywoływanie wywołań systemowych bezpośrednio, ale czasem zdarza się, że jakieś przydatna funkcja systemowa nie jest zaimplementowana w standardowej bibliotece C.
Składnia¶
#include <linux/unistd.h>
Makro _syscall
żądane wywołanie systemowe
Konfiguracja¶
Ważną rzeczą, którą należy wiedzieć o wywołaniu systemowym jest jego prototyp. Trzeba wiedzieć ile posiada ono argumentów, jakie są ich typy i jaki typ zwraca. Istnieje sześć makrodefinicji ułatwiających bezpośrednie wywołania systemu. Ich składnia jest następująca:
gdzie X jest z zakresu 0–5 i oznacza liczbę argumentów wymaganych przez wywołanie systemowe
type jest zwracanym typem
name jest nazwą wywołania systemowego
typeN jest typem N-tego argumentu
argN jest nazwą N-tego argumentu
Te makrodefinicje tworzą funkcję o nazwie name z podanymi argumentami. Po zawarciu _syscall() w pliku źródłowym, można wywoływać wywołanie systemowe poprzez name.
PRZYKŁAD¶
#include <stdio.h> #include <linux/unistd.h> /* dla makra _syscallX */ #include <linux/kernel.h> /* dla struktury sysinfo*/ _syscall1(int, sysinfo, struct sysinfo *, info); /* Uwaga: jeśli kopiowanie odbywa się bezpośrednio ze źródła nroff, należy pamiętać, aby usunąć dodatkowe znaki `´ z printf */ int main(void) { struct sysinfo s_info; int error; error = sysinfo(&s_info); printf("code error = %d\n", error);
printf("Uptime = %ds\nLoad: 1 min %d / 5 min %d / 15 min %d\n"
"RAM: total %d / free %d / shared %d\n"
"Memory in buffers = %d\nSwap: total %d / free %d\n"
"Number of processes = %d\n", s_info.uptime, s_info.loads[0], s_info.loads[1], s_info.loads[2], s_info.totalram, s_info.freeram, s_info.sharedram, s_info.bufferram, s_info.totalswap, s_info.freeswap, s_info.procs); return(0); }
Przykładowe wyjście¶
code error = 0 uptime = 502034s Load: 1 min 13376 / 5 min 5504 / 15 min 1152 RAM: total 15343616 / free 827392 / shared 8237056 Memory in buffers = 5066752 Swap: total 27881472 / free 24698880 Number of processes = 40
UWAGI¶
Makra _syscall() NIE tworzą prototypu. Może istnieć potrzega stworzenia go samodzielnie, szczególnie w przypadku korzystania z C++.
Wywołania systemowe nie muszą koniecznie zwracać jedynie dodatnich lub ujemnych kodów błędu. Trzeba przeczytać źródło, aby upewnić się, jak zwracają one błędy. Zazwyczaj jest to standardowy kod błędu ze znakiem ujemnym, np. -EPERM. Makra _syscall() zwracają wynik r wywołania systemowego jeśli r jest nieujemne, ale zwracają -1 i zmieniają wartość errno na -r jeśli r jest ujemne. Kody błędów można znaleźć w errno(3).
Niektóre wywołania systemowe, takie jak mmap, wymagają więcej niż pięciu argumentów. Jest to osiągane poprzez umieszczanie argumentów na stosie i przekazywanie wskaźnika do bloku argumentów.
Podczas definiowania wywołania systemowego, typy argumentów MUSZĄ zostać przekazane przez wartość lub przez wskaźnik (dla aregatów takich jak struktury).
ZGODNE Z¶
W tym rozdziale występują odwołania do różnych wersji Uniksa i standardów realizowane poprzez skróty. Są to:
- SVr4
- System V Release 4 Unix, opisane w "Programmer's Reference Manual: Operating System API (Intel processors)" (Prentice-Hall 1992, ISBN 0-13-951294-2)
- SVID
- System V Interface Definition, opisane w "The System V Interface Definition, Fourth Edition".
- POSIX.1
- IEEE 1003.1-1990 part 1, aka ISO/IEC 9945-1:1990s, inaczej "IEEE Portable Operating System Interface for Computing Environments", wyjaśnione w "POSIX Programmer's Guide" Donalda Lewine'a (O'Reilly & Associates, Inc., 1991, ISBN 0-937175-73-0.
- POSIX.1b
- IEEE Std 1003.1b-1993 (POSIX.1b standard) opisujący mechanizmy czasu rzeczywistego w przenośnych systemach operacyjnych, inaczej ISO/IEC 9945-1:1996, wyjaśnione w "Programming for the real world - POSIX.4" autorstwa Billa O. Gallmeistera (O'Reilly & Associates, Inc. ISBN 1-56592-074-0).
- SUS, SUSv2
- Single Unix Specification. (Rozwijane przez X/Open i The Open Group. Zobacz także http://www.UNIX-systems.org/version2/ .)
- 4.3BSD/4.4BSD
- Dystrybucje 4.3 i 4.4 systemu Berkeley Unix. 4.4BSD jest zgodny w górę w stosunku do 4.3.
- V7
- Version 7, potomek systemów Unix z Bell Labs.
PLIKI¶
/usr/include/linux/unistd.h
ZOBACZ TAKŻE¶
AUTORZY¶
Nazwiska autorów i warunki kopiowania znajdziesz w nagłówku strony man. Mogą być one odmienne w zależności od strony.
W tłumaczeniu stron podręcznika man z pakietu man-pages, należących do sekcji 2, w ramach Projektu Tłumaczenia Manuali <http://ptm.linux.pl> brali udział (kolejność alfabetyczna):
- Przemek Borys <pborys@dione.ids.pl>
- Adam Byrtek <alpha@irc.pl>
- Andrzej Krzysztofowicz <ankry@mif.pg.gda.pl>
- Rafał Lewczuk <R.Lewczuk@elka.pw.edu.pl>
- Robert Luberda <robert@debian.org>
1996-05-22 | Linux 1.2.13 |